broadway: Use a binary protocol to send to the server
authorJasper St. Pierre <jstpierre@mecheye.net>
Thu, 26 Sep 2013 16:21:08 +0000 (12:21 -0400)
committerJasper St. Pierre <jstpierre@mecheye.net>
Mon, 7 Oct 2013 20:19:01 +0000 (16:19 -0400)
This makes the protocol easier to inspect over the wire and makes all
commands fixed-length.

gdk/broadway/broadway-server.c
gdk/broadway/broadway.js

index c1b3ef5c7ca23c2db523855a743c5f43a398e247..0c56610d5ffbeecc3628d5ba4fa10d343f414b24 100644 (file)
@@ -12,6 +12,8 @@
 #include <stdlib.h>
 #include <string.h>
 #include <errno.h>
+#include <endian.h>
+
 #ifdef HAVE_UNISTD_H
 #include <unistd.h>
 #elif defined (G_OS_WIN32)
@@ -343,22 +345,16 @@ fake_configure_notify (BroadwayServer *server,
   process_input_message (server, &ev);
 }
 
-static char *
-parse_pointer_data (char *p, BroadwayInputPointerMsg *data)
+static guint32 *
+parse_pointer_data (guint32 *p, BroadwayInputPointerMsg *data)
 {
-  data->mouse_window_id = strtol (p, &p, 10);
-  p++; /* Skip , */
-  data->event_window_id = strtol (p, &p, 10);
-  p++; /* Skip , */
-  data->root_x = strtol (p, &p, 10);
-  p++; /* Skip , */
-  data->root_y = strtol (p, &p, 10);
-  p++; /* Skip , */
-  data->win_x = strtol (p, &p, 10);
-  p++; /* Skip , */
-  data->win_y = strtol (p, &p, 10);
-  p++; /* Skip , */
-  data->state = strtol (p, &p, 10);
+  data->mouse_window_id = be32toh (*p++);
+  data->event_window_id = be32toh (*p++);
+  data->root_x = be32toh (*p++);
+  data->root_y = be32toh (*p++);
+  data->win_x = be32toh (*p++);
+  data->win_y = be32toh (*p++);
+  data->state = be32toh (*p++);
 
   return p;
 }
@@ -377,17 +373,16 @@ parse_input_message (BroadwayInput *input, const char *message)
 {
   BroadwayServer *server = input->server;
   BroadwayInputMsg msg;
-  char *p;
+  guint32 *p;
   gint64 time_;
 
   memset (&msg, 0, sizeof (msg));
 
-  p = (char *)message;
-  msg.base.type = *p++;
-  msg.base.serial = (guint32)strtol (p, &p, 10);
-  p++; /* Skip , */
-  time_ = strtol(p, &p, 10);
-  p++; /* Skip , */
+  p = (guint32 *) message;
+
+  msg.base.type = be32toh (*p++);
+  msg.base.serial = be32toh (*p++);
+  time_ = be32toh (*p++);
 
   if (time_ == 0) {
     time_ = server->last_seen_time;
@@ -411,8 +406,7 @@ parse_input_message (BroadwayInput *input, const char *message)
   case BROADWAY_EVENT_LEAVE:
     p = parse_pointer_data (p, &msg.pointer);
     update_future_pointer_info (server, &msg.pointer);
-    p++; /* Skip , */
-    msg.crossing.mode = strtol(p, &p, 10);
+    msg.crossing.mode = be32toh (*p++);
     break;
 
   case BROADWAY_EVENT_POINTER_MOVE: /* Mouse move */
@@ -424,51 +418,42 @@ parse_input_message (BroadwayInput *input, const char *message)
   case BROADWAY_EVENT_BUTTON_RELEASE:
     p = parse_pointer_data (p, &msg.pointer);
     update_future_pointer_info (server, &msg.pointer);
-    p++; /* Skip , */
-    msg.button.button = strtol(p, &p, 10);
+    msg.button.button = be32toh (*p++);
     break;
 
   case BROADWAY_EVENT_SCROLL:
     p = parse_pointer_data (p, &msg.pointer);
     update_future_pointer_info (server, &msg.pointer);
-    p++; /* Skip , */
-    msg.scroll.dir = strtol(p, &p, 10);
+    msg.scroll.dir = be32toh (*p++);
     break;
 
   case BROADWAY_EVENT_KEY_PRESS:
   case BROADWAY_EVENT_KEY_RELEASE:
-    msg.key.mouse_window_id = strtol(p, &p, 10);
-    p++; /* Skip , */
-    msg.key.key = strtol(p, &p, 10);
-    p++; /* Skip , */
-    msg.key.state = strtol(p, &p, 10);
+    msg.key.mouse_window_id = be32toh (*p++);
+    msg.key.key = be32toh (*p++);
+    msg.key.state = be32toh (*p++);
     break;
 
   case BROADWAY_EVENT_GRAB_NOTIFY:
   case BROADWAY_EVENT_UNGRAB_NOTIFY:
-    msg.grab_reply.res = strtol(p, &p, 10);
+    msg.grab_reply.res = be32toh (*p++);
     break;
 
   case BROADWAY_EVENT_CONFIGURE_NOTIFY:
-    msg.configure_notify.id = strtol(p, &p, 10);
-    p++; /* Skip , */
-    msg.configure_notify.x = strtol (p, &p, 10);
-    p++; /* Skip , */
-    msg.configure_notify.y = strtol (p, &p, 10);
-    p++; /* Skip , */
-    msg.configure_notify.width = strtol (p, &p, 10);
-    p++; /* Skip , */
-    msg.configure_notify.height = strtol (p, &p, 10);
+    msg.configure_notify.id = be32toh (*p++);
+    msg.configure_notify.x = be32toh (*p++);
+    msg.configure_notify.y = be32toh (*p++);
+    msg.configure_notify.width = be32toh (*p++);
+    msg.configure_notify.height = be32toh (*p++);
     break;
 
   case BROADWAY_EVENT_DELETE_NOTIFY:
-    msg.delete_notify.id = strtol(p, &p, 10);
+    msg.delete_notify.id = be32toh (*p++);
     break;
 
   case BROADWAY_EVENT_SCREEN_SIZE_CHANGED:
-    msg.screen_resize_notify.width = strtol (p, &p, 10);
-    p++; /* Skip , */
-    msg.screen_resize_notify.height = strtol (p, &p, 10);
+    msg.screen_resize_notify.width = be32toh (*p++);
+    msg.screen_resize_notify.height = be32toh (*p++);
     break;
 
   default:
@@ -574,7 +559,7 @@ parse_input (BroadwayInput *input)
       switch (code) {
       case BROADWAY_WS_CNX_CLOSE:
         break; /* hang around anyway */
-      case BROADWAY_WS_TEXT:
+      case BROADWAY_WS_BINARY:
         if (!fin)
           {
 #ifdef DEBUG_WEBSOCKETS
@@ -583,7 +568,7 @@ parse_input (BroadwayInput *input)
           }
         else
           {
-            char *terminated = g_strndup((char *)data, payload_len);
+            char *terminated = g_memdup ((char *)data, payload_len);
             parse_input_message (input, terminated);
             g_free (terminated);
           }
@@ -593,7 +578,7 @@ parse_input (BroadwayInput *input)
         break;
       case BROADWAY_WS_CNX_PONG:
         break; /* we never send pings, but tolerate pongs */
-      case BROADWAY_WS_BINARY:
+      case BROADWAY_WS_TEXT:
       case BROADWAY_WS_CONTINUATION:
       default:
         {
index 7596e6dbb5a20dfaf8e7cf9fa26612c26cddd1b5..4610c54d0fe6e69125daa264e3d76cfc0ca3be50 100644 (file)
@@ -656,9 +656,17 @@ function getSurfaceId(ev) {
 
 function sendInput(cmd, args)
 {
-    if (inputSocket != null) {
-       inputSocket.send(cmd + ([lastSerial, lastTimeStamp].concat(args)).join(","));
-    }
+    if (inputSocket == null)
+        return;
+
+    var fullArgs = [cmd.charCodeAt(0), lastSerial, lastTimeStamp].concat(args);
+    var buffer = new ArrayBuffer(fullArgs.length * 4);
+    var view = new DataView(buffer);
+    fullArgs.forEach(function(arg, i) {
+        view.setInt32(i*4, arg, false);
+    });
+
+    inputSocket.send(buffer);
 }
 
 function getPositionsFromAbsCoord(absX, absY, relativeId) {